Pristup k promenne z jineho formu

Otázka od: Petr K.

5. 12. 2002 19:07

Zdravim,

Chci se jen zeptat jestli s tim nekdo mate nejakou zkusenost

Mam deklarovanou promenno ve Form2 a chci zjistit její hodnotu z formu1 nebo
z formu1 ji naplnit nejakou hodnotou.


Dik Petr


---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.426 / Virová báze: 239 - datum vydání: 2.12.2002

Odpovedá: Petr Brant

5. 12. 2002 20:19

Pokud mas tu promennou deklarovanou jako public promennou objektu, tak bez
problemu, pokud ji mas jako promennou v tom unitu, tak take. Napriklad

ve form2.pas:
-----------------
type TForm2 = class(TForm)
...
public
 prom: integer;
...
end;

var Form2: TForm2
-----------------

ve form1.pas:
-----------------
uses form2;
...

Form2.prom:= 1 apod.
-----------------

anebo

ve form2.pas:
-----------------
type TForm2 = class(TForm)
...
public
 ...
end;

var Form2: TForm2
    prom: integer;
-----------------

ve form1.pas:
-----------------
uses form2;
...

 prom:= 1 apod.
-----------------

Ten druhy zpusob je mene programatorsky, protoze globalni promenne jsou jiz
od prirody nebezpecne.

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant

D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234


 Subject: Pristup k promenne z jineho formu

 Chci se jen zeptat jestli s tim nekdo mate nejakou zkusenost

 Mam deklarovanou promenno ve Form2 a chci zjistit její hodnotu z
formu1 nebo
 z formu1 ji naplnit nejakou hodnotou.

Odpovedá: Zbysek Hlinka

5. 12. 2002 22:14

On 5 Dec 2002 at 19:17, Petr Brant wrote:

> Pokud mas tu promennou deklarovanou jako public promennou objektu, tak
> bez problemu, pokud ji mas jako promennou v tom unitu, tak take.
> Napriklad
>
> ve form2.pas:
> -----------------
> type TForm2 = class(TForm)
> ...
> public
> prom: integer;
> ...
> end;

Obecne je lepsi deklarovat pristup k promenne pres property, zejmena
pokud by tato promena byla svazana s nejakou mnozinou hodnot, nebo
pokud ovlivnuje neco ve Form2.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Jiri Novotny

6. 12. 2002 9:28

> Chci se jen zeptat jestli s tim nekdo mate nejakou zkusenost
> Mam deklarovanou promenno ve Form2 a chci zjistit její hodnotu z formu1 nebo
> z formu1 ji naplnit nejakou hodnotou.

Ahoj,

tvuj dotaz je formulovan ponekud "ledabyle" IMHO  . Form1 a Form2
jsou nazvy formularu nebo unit? A ta promenna je soucasti formulare
nebo ji ma definovanou v Interface?

Ukazka, jak by to slo v ruznych pripadech delat:

unit Volajici;
interface
uses
  Windows, Messages, ...
type
  TVolajiciForm = class(TForm)
    ....
  private
    I : Integer;
  public
    ...
  end;
var
  VolajiciForm: TVolajiciForm;

implementation
{$R *.DFM}

uses
  Volany;
--------------------------------------------------------

unit Volany;
interface
uses
  Windows, Messages, ...
type
  TVolanyForm = class(TForm)
    ....
  private
    ...
  public
    Prom1 : Integer;
  end;
var
  VolanyForm: TVolanyForm;
  Prom2 : Integer;

implementation
{$R *.DFM}
------------------------------------------------------

Pak ve Volajici muzes kdykoliv priradit do Prom2 cokoliv
(pochopitelne prislusneho datoveho typu) a kdykoliv cist.
Do Prom1 se prirazuje takto:
  Volany.Prom1 := 10
a cte se
I := Volany.Prom1.
Ale pozor, ten formular VolanyForm musi byt v tomto okamziku
uz vytvoreny!

Jirka.

Odpovedá: Jan Sebelík

6. 12. 2002 10:50

> Odesílatel: Petr Brant <brant@dcomm.cz>
> Pokud mas tu promennou deklarovanou jako public promennou objektu, tak bez
> problemu, pokud ji mas jako promennou v tom unitu, tak take. Napriklad

Petr ma stoprocentne ve vsem pravdu.
Ale:

1.
Pokud tato promenna nejak patri k danemu formulari, urcite by to nemela byt
globalni promenna. Co kdybych si vzpomnel vytvorit nekolik instanci Form2? Ci
bude ta promenna.
Ona uz samotna globalni promenna Form2 je na povazenou.
Kazda globalni promenna predstavuje potencialni prusvih.

2.
Pokud v nejake metode TForm1 napisu
  Form2.Nastaveni:=cosi,
dozvi se o tom Form2? Nemel by na to nejak reagovat?
Proto by to mela byt spise property tridy nez polozka tridy.
Form2 na zmenu nastaveni zareaguje v metode SetNastaveni.

3.
Pozor na cyklicka "uses" ke kterym to nekdy svadi. Rikam nekdy.
Zneprehlednuji architekturu projektu, za chvili uz nikdo nevi, kdo komu
"slouzi".
Pokud ma napriklad Form2 soucasne nejak ovlivnovat deni na Form1, lepsi nez
sahat z Form2 na Form1,
je podstrcit do
Form2.OnNecoJsemUdelal metodu tridy TForm1.
Form2 pak ve vhodnem okamziku vola
if Assigned(OnNecoJsemUdelal) then
  OnNecoJsemUdelal(self) // ja
Form1 si to pak sam osetri v
  TForm1.NejakejEventHandler

TForm1:
Form2:=TForm2.Create(self)
Form2.OnNecoJsemUdelal:=NejakejEventHandler.

viz kurz Delphi: Pokrocile techniky

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================